﻿using System;
using System.Collections.Generic;

namespace WUDI.ECharts.Series.Graph
{
	public class Graph
	{

		public String type { get; set; } = "graph";

		/// <summary>
		/// string
		/// 组件 ID。默认不指定。指定则可用于在 option 或者 API 中引用组件。
		/// </summary>
		public String id { get; set; }

		/// <summary>
		/// string
		/// 系列名称，用于tooltip的显示，legend 的图例筛选，在 setOption 更新数据和配置项时用于指定对应的系列。
		/// </summary>
		public String name { get; set; }

		/// <summary>
		/// boolean
		/// 是否启用图例 hover 时的联动高亮。
		/// </summary>
		public Boolean legendHoverLink { get; set; } = true;

		/// <summary>
		/// string
		/// 该系列使用的坐标系，可选：
		/// null 或者 'none'
		///   无坐标系。
		/// 'cartesian2d'
		///   使用二维的直角坐标系（也称笛卡尔坐标系），通过 xAxisIndex, yAxisIndex指定相应的坐标轴组件。
		/// 'polar'
		///   使用极坐标系，通过 polarIndex 指定相应的极坐标组件
		/// 'geo'
		///   使用地理坐标系，通过 geoIndex 指定相应的地理坐标系组件。
		/// 'none'
		///   不使用坐标系。
		/// </summary>
		public GraphCoordinateSystem coordinateSystem { get; set; }

		/// <summary>
		/// number
		/// 使用的 x 轴的 index，在单个图表实例中存在多个 x 轴的时候有用。
		/// </summary>
		public int xAxisIndex { get; set; } = 0;

		/// <summary>
		/// number
		/// 使用的 y 轴的 index，在单个图表实例中存在多个 y轴的时候有用。
		/// </summary>
		public int yAxisIndex { get; set; } = 0;

		/// <summary>
		/// number
		/// 使用的极坐标系的 index，在单个图表实例中存在多个极坐标系的时候有用。
		/// </summary>
		public int polarIndex { get; set; } = 0;

		/// <summary>
		/// number
		/// 使用的地理坐标系的 index，在单个图表实例中存在多个地理坐标系的时候有用。
		/// </summary>
		public int geoIndex { get; set; } = 0;

		/// <summary>
		/// number
		/// 使用的日历坐标系的 index，在单个图表实例中存在多个日历坐标系的时候有用。
		/// </summary>
		public int calendarIndex { get; set; } = 0;

		/// <summary>
		/// boolean
		/// 是否开启鼠标 hover 节点的提示动画效果。
		/// </summary>
		public bool? hoverAnimation { get; set; }

		/// <summary>
		/// string
		/// 图的布局。
		/// 可选：
		/// 'none' 不采用任何布局，使用节点中提供的 x， y 作为节点的位置。
		/// 'circular' 采用环形布局，见示例 Les Miserables，布局相关的配置项见 graph.circular
		/// 'force' 采用力引导布局，见示例 Force，布局相关的配置项见 graph.force
		/// </summary>
		public GraphLayout layout { get; set; } = GraphLayout.none;

		/// <summary>
		/// Object
		/// 环形布局相关配置
		/// </summary>
		public WUDI.ECharts.Series.Graph.Circular.Circular circular { get; set; }

		/// <summary>
		/// Object
		/// 力引导布局相关的配置项，力引导布局是模拟弹簧电荷模型在每两个节点之间添加一个斥力，每条边的两个节点之间添加一个引力，每次迭代节点会在各个斥力和引力的作用下移动位置，多次迭代后节点会静止在一个受力平衡的位置，达到整个模型的能量最小化。
		/// 力引导布局的结果有良好的对称性和局部聚合性，也比较美观。
		/// </summary>
		public WUDI.ECharts.Series.Graph.Force.Force force { get; set; }

		/// <summary>
		/// boolean,string
		/// 是否开启鼠标缩放和平移漫游。默认不开启。如果只想要开启缩放或者平移，可以设置成 'scale' 或者 'move'。设置成 true 为都开启
		/// </summary>
		public dynamic roam { get; set; } = false;

		/// <summary>
		/// number
		/// 鼠标漫游缩放时节点的相应缩放比例，当设为0时节点不随着鼠标的缩放而缩放
		/// </summary>
		public double nodeScaleRatio { get; set; } = 0.6;

		/// <summary>
		/// boolean
		/// 节点是否可拖拽，只在使用力引导布局的时候有用。
		/// </summary>
		public Boolean draggable { get; set; } = false;

		/// <summary>
		/// boolean
		/// 是否在鼠标移到节点上的时候突出显示节点以及节点的边和邻接节点。
		/// </summary>
		public Boolean focusNodeAdjacency { get; set; } = false;

		/// <summary>
		/// string,Function
		/// 关系图节点标记的图形。
		/// ECharts 提供的标记类型包括 
		/// 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'
		/// 可以通过 'image://url' 设置为图片，其中 URL 为图片的链接，或者 dataURI。
		/// URL 为图片链接例如：
		/// 'image://http://xxx.xxx.xxx/a/b.png'
		/// URL 为 dataURI 例如：
		/// 'image://'
		/// 可以通过 'path://' 将图标设置为任意的矢量路径。这种方式相比于使用图片的方式，不用担心因为缩放而产生锯齿或模糊，而且可以设置为任意颜色。路径图形会自适应调整为合适的大小。路径的格式参见 SVG PathData。可以从 Adobe Illustrator 等工具编辑导出。
		/// 例如：
		/// 'path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z'
		/// 如果需要每个数据的图形不一样，可以设置为如下格式的回调函数：
		/// (value: Array|number, params: Object) => string
		/// 其中第一个参数 value 为 data 中的数据值。第二个参数params 是其它的数据项参数。
		/// </summary>
		public dynamic symbol { get; set; } = "circle";

		/// <summary>
		/// number,Array,Function
		/// 关系图节点标记的大小，可以设置成诸如 10 这样单一的数字，也可以用数组分开表示宽和高，例如 [20, 10] 表示标记宽为20，高为10。
		/// 如果需要每个数据的图形大小不一样，可以设置为如下格式的回调函数：
		/// (value: Array|number, params: Object) => number|Array
		/// 其中第一个参数 value 为 data 中的数据值。第二个参数params 是其它的数据项参数。
		/// </summary>
		public dynamic symbolSize { get; set; } = 10;

		/// <summary>
		/// number
		/// 关系图节点标记的旋转角度。注意在 markLine 中当 symbol 为 'arrow' 时会忽略 symbolRotate 强制设置为切线的角度。
		/// </summary>
		public int? symbolRotate { get; set; }

		/// <summary>
		/// boolean
		/// 如果 symbol 是 path:// 的形式，是否在缩放时保持该图形的长宽比。
		/// </summary>
		public Boolean symbolKeepAspect { get; set; } = false;

		/// <summary>
		/// Array
		/// 关系图节点标记相对于原本位置的偏移。默认情况下，标记会居中置放在数据对应的位置，但是如果 symbol 是自定义的矢量路径或者图片，就有可能不希望 symbol 居中。这时候可以使用该配置项配置 symbol 相对于原本居中的偏移，可以是绝对的像素值，也可以是相对的百分比。
		/// 例如 [0, '50%'] 就是把自己向上移动了一半的位置，在 symbol 图形是气泡的时候可以让图形下端的箭头对准数据点。
		/// </summary>
		public List<object> symbolOffset { get; set; } = new List<object>() { 0, 0 };

		/// <summary>
		/// Array,string
		/// 边两端的标记类型，可以是一个数组分别指定两端，也可以是单个统一指定。默认不显示标记，常见的可以设置为箭头，如下：
		/// edgeSymbol: ['circle', 'arrow']
		/// </summary>
		public dynamic edgeSymbol { get; set; } = "['none', 'none']";

		/// <summary>
		/// Array,number
		/// 边两端的标记大小，可以是一个数组分别指定两端，也可以是单个统一指定。
		/// </summary>
		public dynamic edgeSymbolSize { get; set; } = 10;

		/// <summary>
		/// string
		/// 鼠标悬浮时在图形元素上时鼠标的样式是什么。同 CSS 的 cursor。
		/// </summary>
		public String cursor { get; set; } = "pointer";

		/// <summary>
		/// Object
		/// 图形样式。
		/// </summary>
		public WUDI.ECharts.Series.Graph.ItemStyle.ItemStyle itemStyle { get; set; }

		/// <summary>
		/// Object
		/// 关系边的公用线条样式。其中 lineStyle.color 支持设置为'source'或者'target'特殊值，此时边会自动取源节点或目标节点的颜色作为自己的颜色。
		/// </summary>
		public WUDI.ECharts.Series.Graph.LineStyle.LineStyle lineStyle { get; set; }

		/// <summary>
		/// Object
		/// 图形上的文本标签，可用于说明图形的一些数据信息，比如值，名称等，label选项在 ECharts 2.x 中放置于itemStyle下，在 ECharts 3 中为了让整个配置项结构更扁平合理，label 被拿出来跟 itemStyle 平级，并且跟 itemStyle 一样拥有 emphasis 状态。
		/// </summary>
		public WUDI.ECharts.Series.Graph.Label.Label label { get; set; }

		/// <summary>
		/// Object
		/// </summary>
		public WUDI.ECharts.Series.Graph.EdgeLabel.EdgeLabel edgeLabel { get; set; }

		/// <summary>
		/// Object
		/// 高亮的图形样式。
		/// </summary>
		public WUDI.ECharts.Series.Graph.Emphasis.Emphasis emphasis { get; set; }

		/// <summary>
		/// Array
		/// 节点分类的类目，可选。
		/// 如果节点有分类的话可以通过 data[i].category 指定每个节点的类目，类目的样式会被应用到节点样式上。图例也可以基于categories名字展现和筛选。
		/// </summary>
		public List<object> categories { get; set; }

		/// <summary>
		/// Array
		/// 关系图的节点数据列表。
		/// data: [{
		///     name: '1',
		///     x: 10,
		///     y: 10,
		///     value: 10
		/// }, {
		///     name: '2',
		///     x: 100,
		///     y: 100,
		///     value: 20,
		///     symbolSize: 20,
		///     itemStyle: {
		///         color: 'red'
		///     }
		/// }]
		/// 注意: 节点的name不能重复。
		/// </summary>
		public List<object> data { get; set; }

		/// <summary>
		/// Array
		/// 别名，同 data
		/// </summary>
		public List<object> nodes { get; set; }

		/// <summary>
		/// Array
		/// 节点间的关系数据。示例：
		/// links: [{
		///     source: 'n1',
		///     target: 'n2'
		/// }, {
		///     source: 'n2',
		///     target: 'n3'
		/// }]
		/// </summary>
		public List<object> links { get; set; }

		/// <summary>
		/// Array
		/// 别名，同 links
		/// </summary>
		public List<object> edges { get; set; }

		/// <summary>
		/// Object
		/// 图表标注。
		/// </summary>
		public WUDI.ECharts.Series.Graph.MarkPoint.MarkPoint markPoint { get; set; }

		/// <summary>
		/// *
		/// 图表标线。
		/// </summary>
		public WUDI.ECharts.Series.Graph.MarkLine.MarkLine markLine { get; set; }

		/// <summary>
		/// Object
		/// 图表标域，常用于标记图表中某个范围的数据，例如标出某段时间投放了广告。
		/// </summary>
		public WUDI.ECharts.Series.Graph.MarkArea.MarkArea markArea { get; set; }

		/// <summary>
		/// number
		/// 所有图形的 zlevel 值。
		/// zlevel用于 Canvas 分层，不同zlevel值的图形会放置在不同的 Canvas 中，Canvas 分层是一种常见的优化手段。我们可以把一些图形变化频繁（例如有动画）的组件设置成一个单独的zlevel。需要注意的是过多的 Canvas 会引起内存开销的增大，在手机端上需要谨慎使用以防崩溃。
		/// zlevel 大的 Canvas 会放在 zlevel 小的 Canvas 的上面。
		/// </summary>
		public int zlevel { get; set; } = 0;

		/// <summary>
		/// number
		/// 组件的所有图形的z值。控制图形的前后顺序。z值小的图形会被z值大的图形覆盖。
		/// z相比zlevel优先级更低，而且不会创建新的 Canvas。
		/// </summary>
		public int z { get; set; } = 2;

		/// <summary>
		/// string,number
		/// 组件离容器左侧的距离。
		/// left 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比，也可以是 'left', 'center', 'right'。
		/// 如果 left 的值为'left', 'center', 'right'，组件会根据相应的位置自动对齐。
		/// </summary>
		public dynamic left { get; set; } = "center";

		/// <summary>
		/// string,number
		/// 组件离容器上侧的距离。
		/// top 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比，也可以是 'top', 'middle', 'bottom'。
		/// 如果 top 的值为'top', 'middle', 'bottom'，组件会根据相应的位置自动对齐。
		/// </summary>
		public dynamic top { get; set; } = "middle";

		/// <summary>
		/// string,number
		/// 组件离容器右侧的距离。
		/// right 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比。
		/// 默认自适应。
		/// </summary>
		public dynamic right { get; set; } = "auto";

		/// <summary>
		/// string,number
		/// 组件离容器下侧的距离。
		/// bottom 的值可以是像 20 这样的具体像素值，可以是像 '20%' 这样相对于容器高宽的百分比。
		/// 默认自适应。
		/// </summary>
		public dynamic bottom { get; set; } = "auto";

		/// <summary>
		/// string,number
		/// 组件的宽度。
		/// </summary>
		public dynamic width { get; set; } = "自适应";

		/// <summary>
		/// string,number
		/// 组件的高度。
		/// </summary>
		public dynamic height { get; set; } = "自适应";

		/// <summary>
		/// boolean
		/// 图形是否不响应和触发鼠标事件，默认为 false，即响应和触发鼠标事件。
		/// </summary>
		public Boolean silent { get; set; } = false;

		/// <summary>
		/// boolean
		/// 是否开启动画。
		/// </summary>
		public Boolean animation { get; set; } = true;

		/// <summary>
		/// number
		/// 是否开启动画的阈值，当单个系列显示的图形数量大于这个阈值时会关闭动画。
		/// </summary>
		public int animationThreshold { get; set; } = 2000;

		/// <summary>
		/// number
		/// 初始动画的时长，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果：
		/// animationDuration: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public int animationDuration { get; set; } = 1000;

		/// <summary>
		/// string
		/// 初始动画的缓动效果。不同的缓动效果可以参考 缓动示例。
		/// </summary>
		public String animationEasing { get; set; } = "cubicOut";

		/// <summary>
		/// number,Function
		/// 初始动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的初始动画效果。
		/// 如下示例：
		/// animationDelay: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelay { get; set; } = 0;

		/// <summary>
		/// number,Function
		/// 数据更新动画的时长。
		/// 支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果：
		/// animationDurationUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// </summary>
		public dynamic animationDurationUpdate { get; set; } = 300;

		/// <summary>
		/// string
		/// 数据更新动画的缓动效果。
		/// </summary>
		public String animationEasingUpdate { get; set; } = "cubicOut";

		/// <summary>
		/// number,Function
		/// 数据更新动画的延迟，支持回调函数，可以通过每个数据返回不同的 delay 时间实现更戏剧的更新动画效果。
		/// 如下示例：
		/// animationDelayUpdate: function (idx) {
		///     // 越往后的数据延迟越大
		///     return idx * 100;
		/// }
		/// 也可以看该示例
		/// </summary>
		public dynamic animationDelayUpdate { get; set; } = 0;

		/// <summary>
		/// *
		/// 本系列特定的 tooltip 设定。
		/// </summary>
		public WUDI.ECharts.Series.Graph.Tooltip.Tooltip tooltip { get; set; }

	}
}
